﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using ClassLibraryEntidades;

namespace SmartDeviceClient.Interfaz
{
    public partial class VisorImagen : UserControl
    {

        //###############################################################################
        //##########                    ATRIBUTOS Y PROPIEDADES                ##########
        //###############################################################################

        #region Atributos y propiedades

        private int Xflechas;

        private int Yflechas;

        private int anchoOrgura;

        private int altoOrgura;

        private bool raton_presionado;

        private int Xraton;

        private int Yraton;

        private int incrementoRatonX;

        private int incrementoRatonY;

        private Coordenada posicionUsuario;

        private Transporte.TipoTransporte tipoTransporte;

        public String TransporteSeguido
        {
            get { return tipoTransporte.ToString(); }
        }

        private System.Drawing.Bitmap imagen;
        /// <summary>
        /// Imagen que se va a mostrar en el visor.
        /// </summary>
        public System.Drawing.Bitmap Imagen
        {
            set
            {
                imagen = value;
                anchoOrgura = value.Width - this.Width;
                altoOrgura = value.Height - this.Height;
                this.Refresh();
            }
        }

        private Ruta ruta;
        public Ruta RutaPintar { set { ruta = value; } }

        public bool GPS
        {
            get { return false; }
            set { }
        }

        private bool centrarposicion;
        /// <summary>
        /// Indica si el usuario quiere que se centre el visor en la posicion donde se encuentra en cada momento.
        /// </summary>
        public bool CentrarPosicion
        {
            get { return centrarposicion; }
            set { centrarposicion = value; }
        }

        #region Imagenesvehiculos
        private Bitmap imagencaminando;
        private Bitmap imagenvehiculo;
        private Bitmap imagenautobus;
        private Bitmap imagenbicicleta;
        private Bitmap imagenmetro;
        public Bitmap imagenSeguimiento;
        #endregion

        #endregion



        //###############################################################################
        //##########                    CONSTRUCTORES                          ##########
        //###############################################################################

        public VisorImagen()
        {
            InitializeComponent();
            this.Xflechas = 0;
            this.Yflechas = 0;
            this.raton_presionado = false;
            this.ruta = new Ruta();
            posicionUsuario = new Coordenada();
            imagencaminando = new Bitmap(Program.GetAppPath() + @"/Recursos/caminando.png");
            imagenvehiculo = new Bitmap(Program.GetAppPath() + @"/Recursos/coche.png");
            imagenautobus = new Bitmap(Program.GetAppPath() + @"/Recursos/bus.png");
            imagenbicicleta = new Bitmap(Program.GetAppPath() + @"/Recursos/bici.png");
            imagenmetro = new Bitmap(Program.GetAppPath() + @"/Recursos/metro.png");
            imagenSeguimiento = imagencaminando;
        }





        //###############################################################################
        //##########                          MÉTODOS                          ##########
        //###############################################################################
        /// <summary>
        /// Sobreescribimos el método Onpaint para pintar lo que nosotros queramos dentro del visor, entre otras cosas
        /// el mapa y los puntos de la ruta.
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            if (this.imagen != null)
            {
                int numero_nodos = ruta.arcos.Count;

                int posicionX = Xflechas + incrementoRatonX;
                int posicionY = Yflechas + incrementoRatonY;

                Nodo nodo;

                //Pintamos el mapa.
                e.Graphics.DrawImage(this.imagen, posicionX, posicionY);


                //Pintamos todos los nodos como intermedios
                foreach (Arco arco in ruta.arcos)
                {
                    nodo = arco.origen;
                    e.Graphics.FillEllipse(new SolidBrush(Color.Aquamarine), nodo.coordenadas.x + posicionX, nodo.coordenadas.y + posicionY, 10, 10);
                }

                //Pintamos el nodo origen como origen y el destino como destino
                if (numero_nodos > 0)
                {
                    nodo = ruta.arcos[0].origen;
                    e.Graphics.FillEllipse(new SolidBrush(Color.Yellow), nodo.coordenadas.x + posicionX, nodo.coordenadas.y + posicionY, 10, 10);
                    nodo = ruta.arcos[numero_nodos - 1].destino;
                    e.Graphics.FillEllipse(new SolidBrush(Color.Green), nodo.coordenadas.x + posicionX, nodo.coordenadas.y + posicionY, 10, 10);
                }

                //Pintamos la posición del usuario.
                if (posicionUsuario.x != 0 || posicionUsuario.y != 0)
                    e.Graphics.DrawImage(imagenSeguimiento, posicionUsuario.x + posicionX - 2, posicionUsuario.y + posicionY);


            }
        }



        //###############################################################################
        //##########                          EVENTOS                          ##########
        //###############################################################################

        #region Eventos del botones

        private void pictureBoxArriba_Click(object sender, EventArgs e)
        {
            this.Yflechas += 20;
            if (this.Yflechas > 0)
                this.Yflechas = 0;
            this.Refresh();
        }

        private void pictureBoxAbajo_Click(object sender, EventArgs e)
        {
            this.Yflechas -= 20;
            if (this.Yflechas < -altoOrgura)
                this.Yflechas = -altoOrgura;
            this.Refresh();
        }

        private void pictureBoxIzq_Click(object sender, EventArgs e)
        {
            this.Xflechas += 20;
            if (this.Xflechas > 0)
                this.Xflechas = 0;
            this.Refresh();
        }

        private void pictureBoxDech_Click(object sender, EventArgs e)
        {
            this.Xflechas -= 20;
            if (this.Xflechas < -anchoOrgura)
                this.Xflechas = -anchoOrgura;
            this.Refresh();
        }
        #endregion

        #region Eventos del raton

        /// <summary>
        /// Evento que se dispara cuando el raton es presionado sobre el visor
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void VisorImagen_MouseDown(object sender, MouseEventArgs e)
        {
            this.raton_presionado = true;
            Xraton = e.X;
            Yraton = e.Y;
        }

        /// <summary>
        /// Evento que se dispara cuando el raton deja de ser presionado sobre el visor.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void VisorImagen_MouseUp(object sender, MouseEventArgs e)
        {
            this.raton_presionado = false;
            Xflechas += incrementoRatonX;
            Yflechas += incrementoRatonY;
            incrementoRatonX = 0;
            incrementoRatonY = 0;
            this.Refresh();
        }

        /// <summary>
        /// Evento que se dispara cuando arrastramos el raton sobre el visor.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void VisorImagen_MouseMove(object sender, MouseEventArgs e)
        {
            if (this.raton_presionado)
            {
                if ((Xflechas + e.X - Xraton) <= 0 && (Xflechas + e.X - Xraton) >= -anchoOrgura)
                    incrementoRatonX = e.X - Xraton;
                if ((Yflechas + e.Y - Yraton) <= 0 && (Yflechas + e.Y - Yraton) >= -altoOrgura)
                    incrementoRatonY = e.Y - Yraton;
                this.Refresh();
            }
        }

        #endregion

        public void ActualizaPosicion()
        {
            //ESTA PARTE PARA LA OPCIÓN DE LOCALIZACIÓN POR GPS
            //string[]pos = Program.posicionamiento.DamePosicionString(this.textBox1);
            //this.Refresh();


            //ESTA OPCIÓN PARA LOS DE MÁS TIPOS DE LOCALIZACION
            Coordenada posicionActual = Program.posicionamiento.DamePosicion();
            tipoTransporte = Program.posicionamiento.TipoTransporte;

            posicionUsuario = posicionActual;

            if (centrarposicion)
                CentraPosicion();

            this.ComprobarImagenVehiculo();

            this.Refresh();

        }

        private void ComprobarImagenVehiculo()
        {
            switch (tipoTransporte)
            {
                case Transporte.TipoTransporte.caminando:
                    imagenSeguimiento = imagencaminando;
                    break;
                case Transporte.TipoTransporte.bicicleta:
                    imagenSeguimiento = imagenbicicleta;
                    break;
                case Transporte.TipoTransporte.vehiculo:
                    imagenSeguimiento = imagenvehiculo;
                    break;
                case Transporte.TipoTransporte.autobus:
                    imagenSeguimiento = imagenautobus;
                    break;
                case Transporte.TipoTransporte.metro:
                    imagenSeguimiento = imagenmetro;
                    break;
                default:
                    imagenSeguimiento = imagencaminando;
                    break;
            }
        }

        private void CentraPosicion()
        {
            int inc_x, inc_y;
            inc_x = posicionUsuario.x - (this.Width / 2);
            inc_y = posicionUsuario.y - (this.Height / 2);

            Xflechas = -inc_x;
            Yflechas = -inc_y;
            incrementoRatonX = 0;
            incrementoRatonY = 0;

            if (-inc_x > 0)
                Xflechas = 0;
            else if (-inc_x < -anchoOrgura)
                Xflechas = -anchoOrgura;

            if (-inc_y > 0)
                Yflechas = 0;
            else if (-inc_x < -altoOrgura)
                Yflechas = -altoOrgura;

        }

    }
}
